home *** CD-ROM | disk | FTP | other *** search
/ Tech Win 1999 February / TECH Win 02-1999 Disc A.iso / ols / lzh / tcl211.lzh / DLLSRC.lzh / format.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-10-27  |  5.9 KB  |  276 lines

  1. /*-----------------------------------------------------
  2.     format.c
  3.     to make a string to display in the clock
  4.     KAZUBON 1997-1998
  5. -------------------------------------------------------*/
  6.  
  7. #include "tcdll.h"
  8.  
  9. char Yobi[7][11];
  10. char Month[12][11];
  11. char *YobiEng[7] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
  12. char *MonthEng[12] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
  13.     "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
  14. char AM[11], PM[11], SDate[5], STime[5];
  15.  
  16. extern BOOL bHour12, bHourZero;
  17.  
  18. /*------------------------------------------------
  19.   get locale info for 95/NT
  20. --------------------------------------------------*/
  21. int GetLocaleInfoWA(LCTYPE LCType, char* dst)
  22. {
  23.     WCHAR s[11];
  24.     int r;
  25.     
  26.     if(GetVersion() & 0x80000000) // 95
  27.         r = GetLocaleInfoA(LOCALE_USER_DEFAULT, LCType, dst, 10);
  28.     else  // NT
  29.     {
  30.         r = GetLocaleInfoW(LOCALE_USER_DEFAULT,
  31.             LCType, s, 10);
  32.         if(r)
  33.             WideCharToMultiByte(CP_OEMCP, 0, s, -1, dst, 10,
  34.                 NULL, NULL);
  35.     }
  36.     return r;
  37. }
  38.  
  39. /*------------------------------------------------
  40.   load strings of day, month 
  41. --------------------------------------------------*/
  42. void InitFormat(void)
  43. {
  44.     int i;
  45.     
  46.     for(i = 0; i < 6; i++)
  47.     {
  48.         GetLocaleInfoWA(LOCALE_SABBREVDAYNAME1 + i, Yobi[i + 1]);
  49.     }
  50.     GetLocaleInfoWA(LOCALE_SABBREVDAYNAME1 + 6, Yobi[0]);
  51.     for(i = 0; i < 12; i++)
  52.         GetLocaleInfoWA(LOCALE_SABBREVMONTHNAME1 + i, Month[i]);
  53.     GetLocaleInfoWA(LOCALE_S1159, AM);
  54.     GetLocaleInfoWA(LOCALE_S2359, PM);
  55.     GetLocaleInfoWA(LOCALE_SDATE, SDate);
  56.     GetLocaleInfoWA(LOCALE_STIME, STime);
  57. }
  58.  
  59. /*------------------------------------------------
  60.    make a string from date and time format
  61. --------------------------------------------------*/
  62. void MakeFormat(char* s, SYSTEMTIME* pt, char* fmt)
  63. {
  64.     char *sp, *dp, *p;
  65.     
  66.     sp = fmt; dp = s;
  67.     while(*sp)
  68.     {
  69.         if(*sp == '\"')
  70.         {
  71.             sp++;
  72.             while(*sp != '\"' && *sp) *dp++ = *sp++;
  73.             if(*sp == '\"') sp++;
  74.         }
  75.         else if(*sp == '/')
  76.         {
  77.             p = SDate; while(*p) *dp++ = *p++;
  78.             sp++;
  79.         }
  80.         else if(*sp == ':')
  81.         {
  82.             p = STime; while(*p) *dp++ = *p++;
  83.             sp++;
  84.         }
  85.         else if(*sp == 'y' && *(sp + 1) == 'y')
  86.         {
  87.             if(*(sp + 2) == 'y' && *(sp + 3) == 'y')
  88.             {
  89.                 *dp++ = (char)((int)pt->wYear / 1000) + '0';
  90.                 *dp++ = (char)(((int)pt->wYear % 1000) / 100) + '0';
  91.                 sp += 2;
  92.             }
  93.             *dp++ = (char)(((int)pt->wYear % 100) / 10) + '0';
  94.             *dp++ = (char)((int)pt->wYear % 10) + '0';
  95.             sp += 2;
  96.         }
  97.         else if(*sp == 'm')
  98.         {
  99.             if(*(sp + 1) == 'm' && *(sp + 2) == 'e')
  100.             {
  101.                 *dp++ = MonthEng[pt->wMonth-1][0];
  102.                 *dp++ = MonthEng[pt->wMonth-1][1];
  103.                 *dp++ = MonthEng[pt->wMonth-1][2];
  104.                 sp += 3;
  105.             }
  106.             else if(*(sp + 1) == 'm' && *(sp + 2) == 'm')
  107.             {
  108.                 p = Month[pt->wMonth-1];
  109.                 while(*p) *dp++ = *p++;
  110.                 sp += 3;
  111.             }
  112.             else
  113.             {
  114.                 if(*(sp + 1) == 'm')
  115.                 {
  116.                     *dp++ = (char)((int)pt->wMonth / 10) + '0';
  117.                     sp += 2;
  118.                 }
  119.                 else
  120.                 {
  121.                     if(pt->wMonth > 9)
  122.                         *dp++ = (char)((int)pt->wMonth / 10) + '0';
  123.                     sp++;
  124.                 }
  125.                 *dp++ = (char)((int)pt->wMonth % 10) + '0';
  126.             }
  127.         }
  128.         else if(*sp == 'a' && *(sp + 1) == 'a' && *(sp + 2) == 'a')
  129.         {
  130.             p = Yobi[pt->wDayOfWeek];
  131.             while(*p) *dp++ = *p++;
  132.             sp += 3;
  133.         }
  134.         else if(*sp == 'd')
  135.         {
  136.             if(*(sp + 1) == 'd' && *(sp + 2) == 'e')
  137.             {
  138.                 *dp++ = YobiEng[pt->wDayOfWeek][0];
  139.                 *dp++ = YobiEng[pt->wDayOfWeek][1];
  140.                 *dp++ = YobiEng[pt->wDayOfWeek][2];
  141.                 sp += 3;
  142.             }
  143.             else if(*(sp + 1) == 'd' && *(sp + 2) == 'd')
  144.             {
  145.                 p = Yobi[pt->wDayOfWeek];
  146.                 while(*p) *dp++ = *p++;
  147.                 sp += 3;
  148.             }
  149.             else
  150.             {
  151.                 if(*(sp + 1) == 'd')
  152.                 {
  153.                     *dp++ = (char)((int)pt->wDay / 10) + '0';
  154.                     sp += 2;
  155.                 }
  156.                 else
  157.                 {
  158.                     if(pt->wDay > 9)
  159.                         *dp++ = (char)((int)pt->wDay / 10) + '0';
  160.                     sp++;
  161.                 }
  162.                 *dp++ = (char)((int)pt->wDay % 10) + '0';
  163.             }
  164.         }
  165.         else if(*sp == 'h')
  166.         {
  167.             int hour;
  168.             hour = pt->wHour;
  169.             if(bHour12)
  170.             {
  171.                 if(hour > 12) hour -= 12;
  172.                 else if(hour == 0) hour = 12;
  173.                 if(hour == 12 && bHourZero) hour = 0;
  174.             }
  175.             if(*(sp + 1) == 'h')
  176.             {
  177.                 *dp++ = (char)(hour / 10) + '0';
  178.                 sp += 2;
  179.             }
  180.             else
  181.             {
  182.                 if(hour > 9)
  183.                     *dp++ = (char)(hour / 10) + '0';
  184.                 sp++;
  185.             }
  186.             *dp++ = (char)(hour % 10) + '0';
  187.         }
  188.         else if(*sp == 'n')
  189.         {
  190.             if(*(sp + 1) == 'n')
  191.             {
  192.                 *dp++ = (char)((int)pt->wMinute / 10) + '0';
  193.                 sp += 2;
  194.             }
  195.             else
  196.             {
  197.                 if(pt->wMinute > 9)
  198.                     *dp++ = (char)((int)pt->wMinute / 10) + '0';
  199.                 sp++;
  200.             }
  201.             *dp++ = (char)((int)pt->wMinute % 10) + '0';
  202.         }
  203.         else if(*sp == 's')
  204.         {
  205.             if(*(sp + 1) == 's')
  206.             {
  207.                 *dp++ = (char)((int)pt->wSecond / 10) + '0';
  208.                 sp += 2;
  209.             }
  210.             else
  211.             {
  212.                 if(pt->wSecond > 9)
  213.                     *dp++ = (char)((int)pt->wSecond / 10) + '0';
  214.                 sp++;
  215.             }
  216.             *dp++ = (char)((int)pt->wSecond % 10) + '0';
  217.         }
  218.         else if(*sp == 'A' && *(sp + 1) == 'M')
  219.         {
  220.             if(*(sp + 2) == '/' &&
  221.                 *(sp + 3) == 'P' && *(sp + 4) == 'M')
  222.             {
  223.                 if(pt->wHour < 12) *dp++ = 'A';
  224.                 else *dp++ = 'P';
  225.                 *dp++ = 'M'; sp += 5;
  226.             }
  227.             else if(*(sp + 2) == 'P' && *(sp + 3) == 'M')
  228.             {
  229.                 char *p;
  230.                 if(pt->wHour < 12) p = AM; else p = PM;
  231.                 while(*p) *dp++ = *p++;
  232.                 sp += 4;
  233.             }
  234.         }
  235.         else if(*sp == 'a' && *(sp + 1) == 'm' && *(sp + 2) == '/' &&
  236.             *(sp + 3) == 'p' && *(sp + 4) == 'm')
  237.         {
  238.             if(pt->wHour < 12) *dp++ = 'a';
  239.             else *dp++ = 'p';
  240.             *dp++ = 'm'; sp += 5;
  241.         }
  242.         else if(*sp == '\\' && *(sp + 1) == 'n')
  243.         {
  244.             *dp++ = 0x0d; *dp++ = 0x0a;
  245.             sp += 2;
  246.         }
  247.         else *dp++ = *sp++;
  248.     }
  249.     *dp = 0;
  250. }
  251.  
  252. /*------------------------------------------------
  253.   need to display second?
  254. --------------------------------------------------*/
  255. BOOL IsDispSecond(char* fmt)
  256. {
  257.     char *sp;
  258.     
  259.     sp = fmt;
  260.     while(*sp)
  261.     {
  262.         if(*sp == '\"')
  263.         {
  264.             sp++;
  265.             while(*sp != '\"' && *sp) sp++;
  266.             if(*sp == '\"') sp++;
  267.         }
  268.         else if(*sp == 's')
  269.         {
  270.             return TRUE;
  271.         }
  272.         else sp++;
  273.     }
  274.     return FALSE;
  275. }
  276.